iT邦幫忙

2023 iThome 鐵人賽

0
自我挑戰組

打造前端初學的知識培育庫系列 第 25

CSS -youtube 影片 - 圖片懸浮效果 - Day25

  • 分享至 

  • xImage
  •  

前言 :

今天來分享圖片懸浮效果,本來是做遊戲的人物介紹,但後來發現有使用到未授權照片所以就改換成鳥的介紹~順便介紹這個很棒的網站~

Pexels : https://www.pexels.com/zh-TW/license/
/images/emoticon/emoticon07.gif

參考影片 :

https://www.youtube.com/watch?v=-9vp6PyBZdE

語法介紹 :

* white-space : nowrap
* calc()
* :has()
* brightness()
* filter:grayscale()
* grid-gap
* grid-template-columns
* display:grid
* data-text、content : attr(data-text)
* style="--img:url('')"
* text-transform
* ::before、::after
* background:linear-gradient
* -webkit-box-reflect
* :nth-child

成果圖片 :

https://ithelp.ithome.com.tw/upload/images/20231019/201608474pN9bkWtvr.png

示範程式碼 :

https://codepen.io/ywngjyyj-the-vuer/pen/rNoXgVy---

流程圖 - 學習分析解構 :

https://ithelp.ithome.com.tw/upload/images/20231019/20160847hq641RybmH.png

開始實作 :

  1. 在HTML中建立名為.container的容器,內部有5個div容器,
  • 每個都設定class="box",是作為共同設定。
  • class="one~five",是作為個別設定不同的樣式。
  • style="--img:url('')",
<body>
  <div class="container">
    <div class="box one" style="--img:url('https://images.pexels.com/photos/2662434/pexels-photo-2662434.jpeg')" data-text="Black-crested titmouse"></div>
    <div class="box two" style="--img:url('https://images.pexels.com/photos/792416/pexels-photo-792416.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')" data-text="Sialia sialis"></div>
    <div class="box three" style="--img:url('https://images.pexels.com/photos/2078747/pexels-photo-2078747.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')" data-text="Javan Myna "></div>
    <div class="box four" style="--img:url('https://images.pexels.com/photos/2570081/pexels-photo-2570081.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')" data-text="Melospiza"></div>
    <div class="box five" style="--img:url('https://images.pexels.com/photos/4045953/pexels-photo-4045953.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1')" data-text="Merops bulocki"></div>
  </div>
</body>
  1. 在CSS中建立全黑背景、內容置中的環境。
* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}
body {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background: #000;
}
  1. 建立置中的白色區塊,使用
  • display:grid建立網格系統。
  • grid-template-columns建立5個欄位。
  • grid-gap是每個欄位的距離,可以透過對每個box下border來確認(border只是方便觀看,可以隨時刪除)。
  • transition的目的是當你進行移動縮放時比較和緩不會突然移動。
.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
  grid-gap: 20px;
  width: 1000px;
  height: 500px;
  background: #fff;
  transition: 0.5s;
}
.box {
  border: 1px solid red;
}

https://ithelp.ithome.com.tw/upload/images/20231020/20160847Pu0YcSV50h.png

  1. 為每一個box增添圖片,設定
  • background-size: cover ,因為以下原因。
    background-size : contain => 整張圖片會確保都看到情況下並填滿容器,所以當放入長寬不同的容器時,會導致圖片縮小,剩餘空間留白的部分會重複放入照片。
    https://ithelp.ithome.com.tw/upload/images/20231020/20160847S7MLvG65JD.png
    background-size : cover => 圖片會依長寬比放入容器中並填滿容器,當容器小於圖片時,圖片會自動裁剪,容器大於圖片時,圖片也會等比放大,要注意過大可能會失真。
  • background-postion : center =>將圖片設置在背景容器的垂直、水平正中間。
  • filter : brightness(1.25) => brightness(1.25)是調整明亮程度,1是預設值,這裡超過1代表增加亮度。
    https://ithelp.ithome.com.tw/upload/images/20231020/20160847fMRbShF7MQ.png

這邊有與影片不符合的地方是因為個人發現好像不用添加也沒關係,當然不一定是正確的,只是想試試是否能達成相同效果。

  1. 再來我們要設定黑白效果,情況是:一開始圖片都是亮的,當滑到某一個圖片上的時候,其餘的4個圖片就要變成黑白,這裡要記住,以下設定順序不能互換喲~要先從大範圍設定到小範圍。
  • .container:hover .box => 當滑到.container的容器時,.box會產生的效果。
  • .container .box:hover => 當滑到.container容器的.box容器時會產生的效果。
 .container:hover .box {
  filter: grayscale(1);
}
.container .box:hover {
  filter: grayscale(0) brightness(1.25);
}
  1. 為它們添加:has()屬性,
    這裏以.one為例 => 當.one處於:hover 狀態時選中該元素,從而給.container 改變欄位寬度,效果如下。
.container:has(.one:hover) {
  grid-template-columns: 2fr 0.5fr 0.5fr 0.5fr 0.5fr;
}
.container:has(.two:hover) {
  grid-template-columns: 0.5fr 2fr 0.5fr 0.5fr 0.5fr;
}
.container:has(.three:hover) {
  grid-template-columns: 0.5fr 0.5fr 2fr 0.5fr 0.5fr;
}
.container:has(.four:hover) {
  grid-template-columns: 0.5fr 0.5fr 0.5fr 2fr 0.5fr;
}
.container:has(.five:hover) {
  grid-template-columns: 0.5fr 0.5fr 0.5fr 0.5fr 2fr;
}

7.建立圖片上下陰影效果,新增::before偽元素 : 為元素添加樣式,而偽元素是存放在元素裡面的可藉由開發者工具觀察到,
https://ithelp.ithome.com.tw/upload/images/20231021/20160847yAu21r5A9x.png

  • content:'' => 是必要屬性,如果不需要輸入文字就要以content:' '(空白內容呈現)。
  • width: 100% => 讓偽元素的寬度與元素相符。
  • height: calc(100% + 2px) => 調整偽元素高度為元素的100%後,在上下各加2px。
  • background: linear-gradient => 增加漸層效果,可以調整漸變的顏色停止點(這裡是增加),減少黑色和透明間的對比,以使過度更加平滑,上到下 : 黑>透明>透明>透明>黑,使照片有漸層感覺。
  • 接著會發現看不到效果,這時候才在.box裡面增加display:flex,justify-content、align-items,使裡面的內容也就是偽元素水平、垂直置中。
.container .box::before {
  content: "";
  width: 100%;
  height: calc(100% + 2px);
  background: linear-gradient(
    #000,
    transparent,
    transparent,
    transparent,
    #000
  );
}

8.我們可以進一步優化,讓.container .box的所有偶數元素向上移動20px,奇數元素向下移動20px,

.container .box:nth-child(even) {
  transform: translateY(20px);
}
.container .box:nth-child(odd) {
  transform: translateY(-20px);
}

https://ithelp.ithome.com.tw/upload/images/20231021/20160847AiPmDUOOIX.png

9.快結束啦~現在我們使用.container .box ::after偽元素來替每一個.box新增文字說明,這時候就會引用到data-text囉~

  • content: attr(data-text) : 引用HTML文字。
  • position:absolute : 這時候就需要position來定位囉,也因為這樣所以需要在他的父層.box設置position:relative。
  • white-space:nowrap : 這能保證文字不換行。
  • -webkit-box-reflect: below 2px linear-gradient(transparent, #0003) : 建立下方倒影漸層,從透明到半透明黑色。
.container .box::after {
  content: attr(data-text);
  position: absolute;
  bottom: -80px;
  background: #fff;
  color: #000;
  font-size: 1em;
  font-weight: 600;
  padding: 5 ;
  white-space:nowrap;px 15px;
  transition: 0.5s;
  text-transform: uppercase;
  letter-spacing: 0.5em;
  opacity: 0;
  -webkit-box-reflect: below 2px linear-gradient(transparent, #0003);
}

https://ithelp.ithome.com.tw/upload/images/20231021/20160847MKlH9lOX46.png

10.接下來需要優化成,當滑到圖片時,圖片放大時,說明文字才會逐漸浮現,
所以9.的透明度我們先調成0,並新增以下程式碼,這裡需要了解一下.container .box:hover::after及.container .box::after:hover的差別喲

  • 前者是滑到.container .box 時 .container .box::after會產生的反應。
  • 後者是滑到 .container .box::after會產生的反映,因為在這邊只有新增文字及文字樣式,但文字一開始是透明的,所以使用前者會比較直觀。
.container .box:hover::after {
  opacity: 1;
  bottom: -40px;
  transition-delay: 0.2s;
}

鐵人賽真的不容易啊阿~~
就到這邊結束啦~謝謝~/images/emoticon/emoticon08.gif


上一篇
CSS -youtube 影片 - 文字肖像效果、關鍵字集合 - Day24
下一篇
CSS -youtube 影片 - 圖片懸浮效果 - 關鍵字集合1 - Day26
系列文
打造前端初學的知識培育庫30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言